<?php
namespace Zxf5115\Laravel\Local\Upload\Services;

use Illuminate\Support\Facades\Storage;
use Zxf5115\Laravel\Local\Upload\Utils\FileUtil;
use Zxf5115\Laravel\Local\Upload\Utils\Base64FileUtil;
use Zxf5115\Laravel\Local\Upload\Rules\Base64FileRule;
use Zxf5115\Laravel\Resource\Services\ResourceService;


/**
 * @author zhangxiaofei [<1326336909@qq.com>]
 * @dateTime 2025-09-08
 *
 * Base64资源上传服务类
 */
class Base64FileService
{
  /**
   * Base64文件流上传文件
   *
   * @param string $file base64数据文件
   * @param string $path 路径
   * @param array $allowTypes 允许上传类型
   * @param string  $realname 真实文件名
   * @return string|array 上传结果
   */
  public function file(string $file, string $path, array $allowTypes, string $realname) : string|array
  {
    // 上传资源文件内容验证方法
    Base64FileRule::verifyFileData($file, $allowTypes);

    // 获取base64文件数据内容
    $data = Base64FileUtil::getFileData($file);

    // 计算文件哈希值
    $hash = Base64FileUtil::getFileHash($data);

    // 根据哈希验证资源信息是否存在
    $result = ResourceService::verifyFileUploadCompleted($hash, (bool)trim($realname));

    if(!is_null($result))
    {
      return $result;
    }

    // 获取Base64文件媒体类型
    $mimeType = Base64FileUtil::getFileMimeType($file);

    // 获取base64文件后缀
    $extension = Base64FileUtil::getFileExtension($mimeType);

    // 获取待保存文件名称
    $filename = Base64FileUtil::getFileName($data, $extension);

    // 设置文件上传目录
    $dir = FileUtil::setFileDir($path);

    // 组装文件保存路径
    $path = $dir . DIRECTORY_SEPARATOR . $filename;

    // 保存文件
    if(Storage::disk('public')->put($path, $data))
    {
      $url = Storage::url($path);

      // 获取Base64文件大小方法
      $filesize = Base64FileUtil::getFileSize($file);

      // 保存Base64平台文件信息
      self::setFileUploadCompleted($filename, $filesize, $mimeType, $extension, $hash, $url);

      // 获取上传文件响应内容
      return Base64FileUtil::getResourceData($url, $realname);
    }
    else
    {
      return error(__('upload.upload_failed'));
    }
  }


  /**
   * Base64文件流批量上传文件
   *
   * @param string $file base64数据文件
   * @param string $path 路径
   * @param array $allowTypes 允许上传类型
   * @param string  $realname 真实文件名
   * @return string|array 上传结果
   */
  public function batchRichTextFile(string $files, string $path, array $customAllow, bool $realname) : string|array
  {
    $response = [];

    // 上传资源文件是否为空验证
    FileRule::verifyFileExists($files);

    // 批量上传
    foreach($files as $k => $file)
    {
      // 上传资源文件内容验证方法
      Base64FileRule::verifyFileData($file, $allowTypes);

      // 获取base64文件数据内容
      $data = Base64FileUtil::getFileData($file);

      // 计算文件哈希值
      $hash = Base64FileUtil::getFileHash($data);

      // 根据哈希验证资源信息是否存在
      $result = ResourceService::verifyFileUploadCompleted($hash, (bool)trim($realname));

      if(!is_null($result))
      {
        $response[$k] = $result;
      }

      // 获取Base64文件媒体类型
      $mimeType = Base64FileUtil::getFileMimeType($file);

      // 获取base64文件后缀
      $extension = Base64FileUtil::getFileExtension($mimeType);

      // 获取待保存文件名称
      $filename = Base64FileUtil::getFileName($data, $extension);

      // 设置文件上传目录
      $dir = FileUtil::setFileDir($path);

      // 组装文件保存路径
      $path = $dir . DIRECTORY_SEPARATOR . $filename;

      // 保存文件
      if(Storage::disk('public')->put($path, $data))
      {
        $url = Storage::url($path);

        // 获取Base64文件大小方法
        $filesize = Base64FileUtil::getFileSize($file);

        // 保存Base64平台文件信息
        self::setFileUploadCompleted($filename, $filesize, $mimeType, $extension, $hash, $url);

        // 获取上传文件响应内容
        $response[$k] = Base64FileUtil::getResourceData($url, $realname);
      }
    }

    return $response;
  }


  /**
   * 存储上传文件信息
   *
   * @param string $filename 上传名称
   * @param string $filesize 上传大小
   * @param string $mimeType 上传媒体类型
   * @param string $extension 上传后缀
   * @param string $hash 上传哈希值
   * @param string $url 上传地址
   * @return void
   */
  private static function setFileUploadCompleted(string $filename, string $filesize, string $mimeType, string $extension, string $hash, string $url) : void
  {
    $params = [
      'name' => $filename,
      'size' => $filesize,
      'mimetype' => $mimeType,
      'extension' => $extension,
      'hash' => $hash,
      'url' => FileUtil::getCompleteUrl($url)
    ];

    // 保存平台文件信息
    ResourceService::setFileUploadCompleted($params);
  }
}
